Client-side applications are often written in script languages (e.g., Javascript) or compiled into intermediate forms (e.g., bytecode) to run on a wide variety of client computing devices with different central processing unit (CPU) architectures, hardware accelerators, or platform libraries. An interpreter or compiler “just-in-time” (JIT) approach is used to execute the applications on the client computing device.
However, processing power, RAM, and storage capabilities of client computing devices are usually much less capable compared to desktop or server-side components. Even when power and storage capabilities of a client computing device are as capable as a server, battery power consumption of the computing device is a concern. As a result, client-side compilation of software is often light-weight and not as good as server-side compilation.
To cope with client computing devices that lack certain hardware accelerators or platform libraries, some applications may carry extra software libraries to emulate missing hardware or platform capabilities. The extra software, however, wastes bandwidth at download for clients that already have some or all of the software capabilities and thus do not need the extra software.